home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / gemfsc18.lzh / AESSRC18.LZH / AESFUNCS / RSCRRBTN.C < prev    next >
C/C++ Source or Header  |  1992-03-31  |  5KB  |  145 lines

  1. /**************************************************************************
  2.  * RSCRRBTN.C - The obj_rrbuttons() routine.
  3.  *   This changes the specified objects into rounded-rectangle radio 
  4.  *   buttons (by making them USERDEF objects), and supplies the drawing
  5.  *   routine for the buttons.
  6.  *************************************************************************/
  7.  
  8. #include <stdarg.h>
  9. #include "gemfast.h"
  10.  
  11. #ifndef NULL
  12.   #define NULL 0L
  13. #endif
  14.  
  15. /*-------------------------------------------------------------------------
  16.  * rr_draw - Draw a rounded rectangle radio button.  This routine is
  17.  *           called by the AES whenever a rrbutton needs to be drawn
  18.  *           or to have its state changed.  (Note that this routine
  19.  *           gets control in supervisor mode.  Some runtime libraries
  20.  *           will crash on stack overlow problems if you make calls
  21.  *           to DOS, BIOS, or XBIOS from in here.)
  22.  *
  23.  *           We handle SELECTED and DISABLED states here, but other
  24.  *           states are handled by the AES because we pass the states we
  25.  *           didn't do back to the AES as the retval from this routine.
  26.  *-----------------------------------------------------------------------*/
  27.  
  28. static long rr_draw(parmblk)
  29.     register XPARMBLK *parmblk;
  30. {
  31.     int     vdi_handle;
  32.     int     xpos;
  33.     int     ypos;
  34.     int     dmy;
  35.     int     len;
  36.     int     objstate;
  37.     VRECT   cliprect;
  38.     VRECT   boxrect;
  39.  
  40.     if (0 == (vdi_handle = apl_vshared())) {
  41.         return 0;   /* oh well, so sorry */
  42.     }
  43.  
  44.     objstate = parmblk->currstate;
  45.  
  46.     rc_gtov(&parmblk->cliprect, &cliprect);
  47.     vs_clip(vdi_handle, 1, &cliprect);
  48.     
  49.     rc_gtov(&parmblk->drawrect, &boxrect);
  50.     rc_vadjust(&boxrect, 1, 1);
  51.     
  52.     len = strlen((char *)parmblk->pub->ob_spec);
  53.  
  54.     xpos = parmblk->drawrect.g_x + 
  55.                 ((parmblk->drawrect.g_w - gl_wchar * len) / 2);
  56.     ypos = parmblk->drawrect.g_y + 
  57.                 ((parmblk->drawrect.g_h - gl_hchar) / 2);
  58.     
  59.     if (objstate & SELECTED) {
  60.         v_rfbox(vdi_handle, &boxrect);
  61.         vswr_mode(vdi_handle, MD_TRANS);
  62.         vst_color(vdi_handle, 0);
  63.     } else {
  64.         vsf_interior(vdi_handle, IS_HOLLOW);    
  65.         v_rfbox(vdi_handle, &boxrect);
  66.         vsf_interior(vdi_handle, IS_SOLID);
  67.     }
  68.     
  69.     if (objstate & DISABLED) {
  70.         vst_effect(vdi_handle, 0x0002); /* lightened text */
  71.     }
  72.     vst_alignment(vdi_handle, 0, 5, &dmy, &dmy);
  73.     v_gtext(vdi_handle, xpos, ypos, parmblk->pub->ob_spec);
  74.     vst_alignment(vdi_handle, 0, 0, &dmy, &dmy);
  75.     if (objstate & DISABLED) {
  76.         vst_effect(vdi_handle, 0x0000); /* normal text */
  77.     }
  78.     
  79.     if (objstate & SELECTED) { 
  80.         vst_color(vdi_handle, 1);
  81.         vswr_mode(vdi_handle, MD_REPLACE);
  82.     }
  83.     
  84.     vs_clip(vdi_handle, 0, &cliprect);
  85.     
  86.     return (objstate & ~(SELECTED|DISABLED));
  87. }
  88.  
  89. /*-------------------------------------------------------------------------
  90.  * rsc_rrbuttons - Transform all radio buttons into rounded radio buttons.
  91.  *-----------------------------------------------------------------------*/
  92.  
  93. int rsc_rrbuttons(ptree)
  94.     OBJECT           *ptree;
  95. {
  96.     register OBJECT   *pobj;
  97.     register XUSERBLK *pblk;
  98.     register long     *pspec;
  99.     register int       obflags;
  100.     register int       numobj = 0;
  101.     
  102.     if (0 == apl_vshared()) {
  103.         return -35;             /* no more handles */
  104.     }
  105.  
  106. /*
  107.  * count the number of button objects we'll be transforming...
  108.  */
  109.  
  110.     for (pobj = ptree; ; ++pobj) {
  111.         obflags = pobj->ob_flags;         
  112.         if ((pobj->ob_type & 0x00FF) == G_BUTTON && (obflags & RBUTTON)) {
  113.             ++numobj;
  114.         }
  115.         if (obflags & LASTOB) {         /* stop after doing last    */
  116.             break;                      /* object in the tree.      */
  117.         }
  118.     }
  119.  
  120. /*
  121.  * allocate a chunk of memory to hold all the XUSERBLKs we're going
  122.  * to attach to the objects.
  123.  */
  124.  
  125.     if (NULL == (pblk = apl_malloc((long)(numobj * sizeof(*pblk))))) {
  126.         return -39;
  127.     }
  128.  
  129. /*
  130.  * now go through and change each radio button object into a USERDEF.
  131.  */
  132.  
  133.     for (pobj = ptree; ; ++pobj) {
  134.         obflags = pobj->ob_flags;         
  135.         if ((pobj->ob_type & 0x00FF) == G_BUTTON && (obflags & RBUTTON)) {
  136.             obj_mxuserdef(pblk++, pobj, rr_draw);
  137.         }
  138.         if (obflags & LASTOB) {         /* stop after doing last    */
  139.             break;                      /* object in the tree.      */
  140.         }
  141.     }
  142.  
  143.     return 0;
  144. }
  145.